C++程序设计中的时间性能优化
陈雪
(91550部队,辽宁省大连市,116023)
本文首先对C++程序设计特摘点进行分析,进而探讨其程序时要间性能的优化措施,包括减少临时对象、多使用初始化列表、合理运用inline、优化数据结构设计等,以期为C++程序设计提供参考。
【关键词】C++程序;时间性能;设计优化
时间性能是衡量一个C-H-程序性能优劣的重要指标,在程序设计过程中,采用不同的数据结构、对象调用方式,都会对程序时间性能产生影响。如果程序运行时间超出用户的等待时间上限,即使其能够完成某方面的功能,也无法投入实际应用。因此,需要釆用有效的时间性能优化方法,改善程序整体性能水平。
1、C++程序设计特点C++编程语言是在C语言的基础上演化发展形成的,继承C语言的特点,并弥补了C语言存在的缺陷。在计算机程序语言发展过程中,C++语言占有重要地位,在很大程度上推动了计算机编程语言发展。从本质上来看,C++编程语言是一种面向过程、面向对象的编程语言,支持使用各种编程范式,能够完成各种各样的软件系统开发任务,包括操作系统及引擎开发。其主要特点是支持多态性、支持继承和重用、支持数据封装及数据隐藏,具有较强的灵活性。釆用C++编程语言进行程序设计开发,一般在集成开发环境(IDE)下进行,开发环境功能齐全,完成编程后可直接在环境中进行测试,常用的C++程序编译器包括DecC、Ultimate++、CFree等。在编程过程中,由于编译器会自动生成中间数据结构和代码,对于程序开发人员是不可见的。因此,只有具有长时间编程经验、非常了解C++语言的程序设计人员才能够掌握编译器自动生产代码的条件和时机。这为C++程序时间性能调控增加了一定难度,需要积极研究其时间性能优化设计方法,提高C++程序的实用性。
2、C++程序设计中的时间性能优化措施2.1 减少临时对象
在c
++程序语言中,有时需要使用到临时对象。在程序中没有对临时对象的定义,而是由编译器直接生成,一般出现在两种情况。第一种情况是对象作为参数,传递给函数时,编译器会自动生成一个临时对象用于参数传递。第二种情况是函数的返回结果为对象时,编译器也会生成一个临时对象。这主要是由于C++语言是一种面向对象的编程语言,在程序设计和运行过程中,需要频繁使用类和对象。在类中包含有许多函数,其中包括构造函数及析构函数。设计的C++程序在调用类时,需要获取类的实例,也就是对象,所以会出现上述两种情况,其根本原因是对类中构造函数、析构函数的调用。在产生临时对象的过程中,会占用一定的空间和时间性能,如果程序中大量使用临时对象,则会增加系统运行压力。因此,需要减少C++程序中临时对象的使用。
2.2 多使用初始化列表
在C++程序中如果要使用一个类,先要调用其构造函数,完成成员变量初始化工作。实际上,在类的定义过程中已经创建了类中的成员变量,调用构造函数相当于对变量进行重新复赋值。使用初始化列表的作用也是对类的成员变量进行初始化,而且只需要调用以一次类的构造函数。比如在C++程序代码中有:
A::A(intpa,char*p){
a=ap;
Name=p;
};
在调用该构造函数时,成员变量Name已经创建成功,执行到“Name=p”时相当于对Name进行重载。在此过程中,相当于调用两个函数,即Name的构造函数以及”的重载函数。而使用初始化列表的方式完成参数赋值,则只调用Name的构造函数,可以有效缩短变量初始化时间,提高程序时间性能。釆用初始化列表的赋值方式如下:
A::A(intpa,char*p):a(pa),name(p){};
2.3合理运用inline在C++程序中使用inline的效果是在编译时釆用函数体代码代替原调用指令。即编译执行文件中的函数调用部分会直接替换为函数代码,从而减少函数进栈和出栈时的运行时间。将函数代码替换到调用位置后,还可以使程序编译器对代码产生更多了解,在信息支持下对代码进行优化。如果不使用inline,在执行到函数位置时,则会跳转到函数体位置执行其代码,容易岀现操作系统缺页中断现象,需要将缺页代码移入到内存中,导致程序运行时间大幅度增加。不过这种方法虽然能够节省函数编译和执行时间,但将函数代码替换到函数调用部分,会增加内存占用。如果大量使用这种方法,可能会导致内存空间不足,降低程序空间性能。因此,需要对inline进行合理使用,适当的牺牲空间性能提升程序时间性能。
2.4 尽可能不使用虚函数。在C++语言中,虚函数具有一定的特殊性,与C语言的虚函数有所不同。具体而言,C++虚函数具有运行时多态性,这是许多程序语言不具备的功能。这种多态性特点可以使虚函数应用更加灵活,但是也会增加程序运行过程中的空间和时间性能压力。在C++程序设计过程中,每个虚函数对应一张虚函数表,其中存放着函数指针。在调用过程中,每执行一次实例化操作,虚函数就会生成一张虚函数表,牺牲的空间和时间性能不容忽视。因此,站在提升程序时间性能的角度,应尽可能减少对C++虚函数的使用。如果釆用其他方法能够达到与虚函数同样的效果,应优先选择其他方法。
2.5 智能指针优化运用
在C++程序中对指针类型的使用非常广泛,通过合理运用指针,能够同时优化C++程序的时间和空间性能。比如要将大量复杂信息存储到程序内部,将信息存储单元存放在类中,再将类的对象存储到STL容器中。要完成该操作过程,如果直接以对象形式进行存储,会出现一个信息单元在内存中多个对象中重复存储的现象,造成空间资源浪费。而且在执行存入和取出操作时,还会增加系统运行时间。针对这种问题,通过改为存储对象指针,一个信息单元实际只被存储在一个对象中,然后利用指针进行存入和取出。但是在指针使用过程中,如果没有控制好指针的释放,或出现多次释放问题,则会引发程序异常。C++语言在Boost库中定义了智能指针shared_ptr以及智能数组指针shared_arrayo使用智能指针可以在使用结束后自动释放,从而充分发挥指针调用方法对于C++程序的空间和时间性能优化作用。
2.6 STL成员函数的运用
在STL容器中对许多程序执行操作进行了定义,包括插入和赋值等操作。其成员函数包括insert、eraseassign>empty、count>resize等,程序设计人员需要明确STL容器中的函数功能,优先使用STL容器中的函数。由于STL容器中的函数程序简洁,运行效率较高。如果STL容器中的函数操作对象为某区间的系列元素,则该函数被称为区间成员函数,具体包括区间插值函数、区间构造函数、区间赋值函数等。相比于实现同样功能的向容器中插入一个元素的函数代码,采用区间成员函数具有明显的时间性能优势。比如要将m各数据插入到大小为n的vector头部,采用常规方法需要调用n次insert函数,对vector内数据移动n*m次,而采用区间插入函数,只调用1次insert函数,对vector内数据移动n次,可以极大的缩短程序运行时间。
2.7 Vector和reserve搭配使用
Vector是一种STL容器,采用连续数据存储方式,若内存不足,则会开辟新连续内存,并将原实例复制到新的内存空间中。如果在vector中存储的是类,对其进行复制时则要调用类的构造函数。在vector容器中,采用size方法返回元素个数,釆用capacity方法返回当前内存可容纳元素个数。在不同编译器下,对vector容器开辟新内存的定义不同,部分为原内存大小1.5倍,部分为2倍。由于在开辟新内存后需要将原实例复制到新内存中,会增加运行时间。为避免出现这种情况,可以在vector前先使用reserve方法,为其预先分配内存空间,从而降低需要新分配内存空间的几率。
2.8 优化数据结构
在C++程序设计过程中,优化数据结构是提升程序时间性能的一个重要方式。C++程序是由数据结构、算法组成的,其中,数据结构是基础,算法是数据的操作方法。在C++标准库中包含多种高级数据结构类型,包括上述提高的vector,还有map、list>set等。通过灵活运用这些数据结构,可以有效优化程序运行过程,减少执行时间。比如在map数据结构的使用过程中,主要负责存储由关键词定位的数据信息,但如果关键词范围及数据量大小相差不多,则更适合釆用vector结构进行存储。再比如list是一种数据链表结构,其数据分散存储在内存中,并通过采用指针建立索引,在vector结构无法预知应分配的内存大小时,可以釆用list数据结构。
3 结束语综上所述,在C++程序设计过程中,可以通过采用多种时间性能优化方法,改善程序设计方式,缩短程序运行时间。应将时间性能作为C++程序设计指标,随时考虑时间性能方面的影响因素,对各种时间性能优化方法进行组合应用,从而使其能够达到程序设计要求。
参考文献[1]刘玮,李广力,王冠成,崔天明.基于云模型的程序时间性能评价方法[J].计算机工程与设计,2018,39(02):435-440.
[2]张凯,张宁.试谈C++程序设计中的时间性能优化[J].
电脑编程技巧与维护,2016(08):34-35+37.
[3]赵美勇,崔旭冉,宋思睿.程序设计的时间复杂度优化技巧[J].
数字通信世界,2019(01):5+46.
作者简介:陈雪(1981-),女,吉林省公主岭市人。硕士研究生,工程师。研究方向为测控软件、图像处理。